package plugin

import (
	"context"
	"fmt"
)

// ServicePluginInfo 包含更多的插件信息，扩展自基本的PluginInfo
type ServicePluginInfo struct {
	ID          string                 `json:"id"`
	Name        string                 `json:"name"`
	Type        PluginType             `json:"type"`
	Mode        PluginMode             `json:"mode"`
	Version     string                 `json:"version"`
	APIVersion  int                    `json:"api_version"`
	Author      string                 `json:"author"`
	Description string                 `json:"description"`
	License     string                 `json:"license"`
	Homepage    string                 `json:"homepage"`
	Config      map[string]interface{} `json:"config"`
}

// ServicePlugin 扩展基本Plugin接口，添加额外功能
type ServicePlugin interface {
	// 继承基本Plugin接口
	Plugin

	// GetServiceInfo 返回扩展的插件信息
	GetServiceInfo() ServicePluginInfo
}

// PluginDiscoveryService 定义扩展的插件发现接口
type PluginDiscoveryService interface {
	// FindPlugins 查找插件
	FindPlugins(ctx context.Context, pluginType PluginType) ([]ServicePluginInfo, error)
	// GetPluginInfo 获取插件信息
	GetPluginInfo(ctx context.Context, id string) (ServicePluginInfo, error)
}

// PluginLoaderService 定义扩展的插件加载接口
type PluginLoaderService interface {
	// LoadPlugin 加载插件
	LoadPlugin(ctx context.Context, info ServicePluginInfo, hostFunctions interface{}) (Plugin, error)
	// UnloadPlugin 卸载插件
	UnloadPlugin(ctx context.Context, plugin Plugin) error
}

// PluginRegistry 扩展的插件管理器接口，负责插件的生命周期管理
type PluginRegistry interface {
	PluginDiscoveryService
	// RegisterPlugin 注册插件
	RegisterPlugin(ctx context.Context, info ServicePluginInfo) error
	// UnregisterPlugin 注销插件
	UnregisterPlugin(ctx context.Context, id string) error
	// GetLoadedPlugin 获取已加载的插件
	GetLoadedPlugin(ctx context.Context, id string) (Plugin, error)
	// ListPlugins 列出所有已注册的插件
	ListPlugins(ctx context.Context, pluginType PluginType) ([]ServicePluginInfo, error)
	// EnablePlugin 启用插件
	EnablePlugin(ctx context.Context, id string) error
	// DisablePlugin 禁用插件
	DisablePlugin(ctx context.Context, id string) error
	// ConfigurePlugin 配置插件
	ConfigurePlugin(ctx context.Context, id string, config map[string]interface{}) error
	// IsPluginEnabled 检查插件是否已启用
	IsPluginEnabled(ctx context.Context, id string) (bool, error)
	// Close 关闭插件管理器
	Close(ctx context.Context) error
}

// PluginRegistrarService 扩展的插件注册接口
type PluginRegistrarService interface {
	// Register 注册一个插件
	Register(pluginImpl interface{}) error
}

// 扩展插件系统错误
var (
	// ErrPluginNotFoundService 表示插件未找到
	ErrPluginNotFoundService = fmt.Errorf("plugin not found")

	// ErrPluginAlreadyRegisteredService 表示插件已注册
	ErrPluginAlreadyRegisteredService = fmt.Errorf("plugin already registered")

	// ErrPluginNotEnabledService 表示插件未启用
	ErrPluginNotEnabledService = fmt.Errorf("plugin not enabled")

	// ErrIncompatibleAPIVersionService 表示插件API版本不兼容
	ErrIncompatibleAPIVersionService = fmt.Errorf("incompatible plugin API version")

	// ErrUnsupportedPluginModeService 表示不支持的插件模式
	ErrUnsupportedPluginModeService = fmt.Errorf("unsupported plugin mode")
)
